//*************************************************************************** ////////////////////////////////////////////////////////////////////////////* //『narabemacro』(並べまくろう!) //* //グラフ上でより便利にトレースを修正するツール一式 2003.08.28 //* // @トレースを並べる //* // Aカーソル間を線形につなぎ、修正する。 //* // //* //履歴 2004.03.29 カーソルA・Bが逆配置でも線形結合可能にした。 //* // 3回までのUndo機能を追加した。 //* // 情報を表示機能をアイコン化した。 //* // カーソルAの値を直接変更する機能を追加した。 //* ////////////////////////////////////////////////////////////////////////////* //*************************************************************************** #pragma rtGlobals=1 // Use modern global access method. Macro narabemacro() //メニューバーの配置 ControlBar 18 ValDisplay valdisp_ver size={85,18},pos={0,0},title="narabemacro",value=0 valDisplay valdisp_ver,help={"Undo可能回数が窓の中に表示されます。"} Button Undo_butt, size={40, 18},pos={85,0},title="Undo",proc = undo_proc Button Undo_butt,help={"3回まで変更データをやり直しできます。ただし、「並べる」操作のやり直しはできません。"} Button Edit_butt, size={40, 18},pos={125,0},title="EDIT",proc = EDIT_A_cor Button Edit_butt,help={"カーソルAがのっているウェーブについて、そのポイントの値を直接修正できます。"} Button LinearIntp, size={40, 18},pos={165,0},title="結ぶ",proc = LinearInterpolation Button LinearIntp, help={"カーソルA・B間を直線で結ぶ。データは修正されます。"} Button But_arrange, size={50, 18},pos={205,0},title="並べる",proc = arrange_trace Button But_arrange,help={"等間隔にトレースを並べます。この操作については、Undoはできません。"} Button Info_butt, size={40, 18},pos={255,0},title="Info",proc = Info_proc Button Info_butt,help={"最下部に情報を表示させます。2回押すと、非表示になります。"} Button liner_butt, size={40, 18},pos={295,0},title="liner",proc =liner Button liner_butt,help={"カーソル間を直線で引きます。"} Button LinearIntpEND, size={40, 18},pos={335,0},title="終了",proc = LinearInterpolationEnd //undo機能のための編集未然ウェーブ&情報を //バックアップするデータフォルダを作成 //////////////////////////////// //////////////////////////////// newdatafolder/O root:Udata //バックアップデータフォルダの作成 //////////////////////////////// //////////////////////////////// string/G WLIST=";;;" //編集未然のウェーブ名をリスト保持 variable/G YNinfo=1 //情報欄の表示・非表示を保持 variable/G counter_u=0 //undo可能回数をカウント end //カーソルAの値を変更します function EDIT_A_cor(ctrName) : ButtonControl String ctrName svar WLIST variable xa=pcsr(A) //カーソルAがトレース上に配置されていないとき if(numtype(xa)!=0) //x軸のポイントが通常の数値でない場合 print "カーソルが正しく置かれていません。" return 0 endif wave w1=CsrWaveRef(A) //プロンプト画面を表示させ、値を入力させる。 variable valueQ=w1[xa] Prompt valueQ, "変更後のカーソルAの数値を入力: " DoPrompt "EDIT:カーソルAの数値変更", valueQ if (V_Flag) return -1 // User canceled endif if(valueQ==w1[xa]) return -1 //同じ入力値はスルーする。 endif //変更前の情報を記憶する //データフォルダに現在編集される予定のウェーブをコピーする if(WaveExists(root:Udata:back2)==1) duplicate/O root:Udata:back2,root:Udata:back3 else duplicate/O w1,root:Udata:back3 endif if(WaveExists(root:Udata:back1)==1) duplicate/O root:Udata:back1,root:Udata:back2 else duplicate/O w1,root:Udata:back2 endif duplicate/O w1,root:Udata:back1 //WLISTを更新する WLIST=AddListItem(nameofwave(w1),WLIST,";",0) WLIST=RemoveListItem(3,WLIST) //リストの中身は"@;A;B;"の順番 w1[xa]=valueQ count_undo() end //Undo可能回数をカウントする function count_undo() svar WLIST nvar counter_u if(strlen(StringFromList(0,WLIST))==0) //1番目からすでにゼロ counter_u=0 elseif(strlen(StringFromList(1,WLIST))==0) //2番目からゼロ counter_u=1 elseif(strlen(StringFromList(2,WLIST))==0) //3番目でゼロ counter_u=2 else //つまり3番目まで詰まってる counter_u=3 endif ValDisplay valdisp_ver , value=#counter_u end //カーソル間を直線で結びます。 function LinearInterpolation(ctrName) : ButtonControl String ctrName svar WLIST //カーソルの状況を確認 Variable/D i, xa, xb, ya, yb, px, a0 xa=pcsr(A) ya=vcsr(A) xb=pcsr(B) yb=vcsr(B) px=xb-xa a0=(yb-ya)/(xb-xa) //カーソルが置かれていない場合 if(numtype(xa+xb)!=0) //x軸のポイントが通常の数値でない場合 print "カーソルが正しく置かれていません。" return 0 endif //カーソルA,Bの置かれているウェーブが一致しない場合 if(stringmatch(nameofwave(CsrWaveRef(B)),nameofwave(CsrWaveRef(A)))==0) DoAlert 0,"カーソルA、カーソルBを同じトレースに配置してください。" return 0 endif //次の作業に進む wave w1=CsrWaveRef(A) //データフォルダに現在編集される予定のウェーブをコピーする if(WaveExists(root:Udata:back2)==1) duplicate/O root:Udata:back2,root:Udata:back3 else duplicate/O w1,root:Udata:back3 endif if(WaveExists(root:Udata:back1)==1) duplicate/O root:Udata:back1,root:Udata:back2 else duplicate/O w1,root:Udata:back2 endif duplicate/O w1,root:Udata:back1 //WLISTを更新する WLIST=AddListItem(nameofwave(w1),WLIST,";",0) WLIST=RemoveListItem(3,WLIST) //リストの中身は"@;A;B;"の順番 // // i=1 do if(xaxb) w1[xa-i]=w1[xa]-a0*i else print "カーソルが同じポイントになってますよ。" endif i += 1 while( i < abs(px) ) count_undo() End //Undoボタンが押されたとき function undo_proc(ctrname) : ButtonControl string ctrname svar WLIST //WLISTの1番目がヌルじゃないか調べる if(strlen(StringFromList(0,WLIST))==0) return 0 else //Undoが押されるごとに、前の情報に更新していく wave nw1=$StringFromList(0,WLIST) duplicate/O root:Udata:back1,nw1 duplicate/O root:Udata:back2,root:Udata:back1 duplicate/O root:Udata:back3,root:Udata:back2 WLIST=RemoveListItem(0,WLIST) WLIST=AddListItem("",WLIST,";",2) count_undo() endif end //情報を表示・非表示にさせる function Info_proc(ctrname) : ButtonControl string ctrname nvar YNinfo if(YNinfo==1) hideinfo cursor/K A cursor/K B YNinfo=0 else showInfo YNinfo=1 endif end //トレースを入力ステップ間隔で、並べます。 function arrange_trace(ctrname) : ButtonControl string ctrname //ダイアログを表示させ、ステップ数を入力させる Variable step=100 Variable updown Variable level Prompt step, "間隔の数値を入力: " Prompt updown, "昇順or降順?: ", popup, "昇順;降順;" Prompt level,"普通に並べる?それとも、ウェーブの最小値を基準に並べる?", popup,"普通に並べる;ウェーブの最小値を基準に並べる;" DoPrompt "並べて表示", step,updown,level print step,updown,level //最前面のグラフウィンドウからトレース名のリストを取得 string tracelist=TraceNameList("",";",1) variable NumberOfTrace=ItemsInList(tracelist)//アイテム数を取得 string name variable minmum variable v1=0 do name=StringFromList(v1,tracelist) if( strlen(name) == 0 ) break else if(level==1) minmum=0 else WaveStats/Q $name minmum=V_min //Print minmum endif if(updown==1) ModifyGraph offset($name)={0,step*v1-minmum} else ModifyGraph offset($name)={0,(-1)*step*v1-minmum} endif endif v1=v1+1 while(v10) RemoveFromGraph baseB endif appendtograph baseB vs wx1 end //『閉じる』ボタンが押されたとき、配置されたコントロールを削除します。////////// function LinearInterpolationEnd(ctrName) : ButtonControl String ctrName KillControl LinearIntp KillControl LinearIntpEND KillControl But_arrange KillControl undo_butt killcontrol Edit_butt killcontrol valdisp_ver killcontrol Info_butt killcontrol liner_butt /////////////////////////// /////////////////////////// killdatafolder root:Udata //データフォルダの削除 /////////////////////////// /////////////////////////// Killstrings/Z WLIST killvariables/Z YNinfo,counter_u ControlBar 0 end //********************************************************************************* ////////以上で、『narabemacro』のコードは終了です。////////////////////////////////// //*********************************************************************************